package com.atguigu.gmall;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureDemo {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        //1.创建多线程 异步 无返回值
        /*CompletableFuture.runAsync(()->{
            System.out.println(Thread.currentThread().getName());
        });*/
        //2.创建多线程 异步 有返回值 会阻塞
        /*CompletableFuture<String> stringCompletableFuture = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName());
            int i = 1 / 0;
            return "hello";

            //4.计算完成时的回调方法 处理返回值及异常
        }).whenComplete((t, u) -> {//继续沿用上一个任务的线程
            //第二个任务，依赖于第一个任务执行完，收尾
            //t：第一个任务的返回值
            //u：第一个任务的异常信息
            System.out.println("t = " + t);
            System.out.println("u = " + u);
        }).whenCompleteAsync((t, u) -> {//去线程池取新的线程

        }).exceptionally(u -> {
            System.out.println("u = " + u);
            return "hello";
        });
        System.out.println(stringCompletableFuture.get());*/

        //5.多线程串行
        CompletableFuture<Void> h1 = CompletableFuture.supplyAsync(() -> {
            System.out.println("我是第一个任务，我创建了一个线程");
            return 1;
        }).thenApply((t) -> {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("thenApply接收上一个任务的返回值是t：" + t);
            return 2;
        }).thenAccept((t) -> {
            System.out.println("thenAccept接收上一个任务的返回值是t：" + t);
        }).thenRun(() -> {
            System.out.println("theRun我只执行自己的程序");
        });
        //6.多线程并行
        CompletableFuture<Integer> h2 = CompletableFuture.supplyAsync(() -> {
            System.out.println("并行第二个任务，我创建了一个线程");
            return 1;
        });

        CompletableFuture.allOf(h1,h2).join();
        //3.创建多线程 有入参，有返回值
        /*CompletableFuture<String> hello = CompletableFuture.completedFuture("Hello");
        System.out.println(hello.get());*/
        System.out.println(Thread.currentThread().getName());
    }
}
